

#ifndef UC_GECINT3D_H
#define UC_GECINT3D_H

#include "zadesk.h"
#include "zgeent3d.h"
#include "zgeponc3d.h"
#include "zgeintrvl.h"
#pragma pack (push, 8)

class UcGeCurve3d;

class  
GE_DLLEXPIMPORT
UcGeCurveCurveInt3d : public UcGeEntity3d
{

public:

    UcGeCurveCurveInt3d ();
    UcGeCurveCurveInt3d (const UcGeCurve3d& curve1, const UcGeCurve3d& curve2,
		                 const UcGeVector3d& planeNormal =
						 UcGeVector3d::kIdentity,
                         const UcGeTol& tol = UcGeContext::gTol );
    UcGeCurveCurveInt3d (const UcGeCurve3d& curve1, const UcGeCurve3d& curve2,
                         const UcGeInterval& range1, const UcGeInterval& range2,
		                 const UcGeVector3d& planeNormal=UcGeVector3d::kIdentity,
                         const UcGeTol& tol = UcGeContext::gTol);
    UcGeCurveCurveInt3d (const UcGeCurveCurveInt3d& src);

    const UcGeCurve3d  *curve1          () const;
    const UcGeCurve3d  *curve2          () const;
    void               getIntRanges     (UcGeInterval& range1,
                                         UcGeInterval& range2) const;
	UcGeVector3d	   planeNormal		() const;
    UcGeTol            tolerance        () const;

    int                numIntPoints     () const;
    UcGePoint3d        intPoint         (int intNum) const;
    void               getIntParams     (int intNum,
                                         double& param1, double& param2) const;
    void               getPointOnCurve1 (int intNum, UcGePointOnCurve3d& pntOnCrv) const;
    void               getPointOnCurve2 (int intNum, UcGePointOnCurve3d& pntOnCrv) const;
    void			   getIntConfigs    (int intNum, UcGe::UcGeXConfig& config1wrt2, 
                                         UcGe::UcGeXConfig& config2wrt1) const;
    ZSoft::Boolean     isTangential     (int intNum) const;
    ZSoft::Boolean     isTransversal    (int intNum) const;
    double             intPointTol      (int intNum) const;
    int                overlapCount     () const;
	ZSoft::Boolean	   overlapDirection () const;
    void               getOverlapRanges (int overlapNum,
                                         UcGeInterval& range1,
                                         UcGeInterval& range2) const;

    void               changeCurveOrder ();

    UcGeCurveCurveInt3d& orderWrt1  ();    
    UcGeCurveCurveInt3d& orderWrt2  ();

    UcGeCurveCurveInt3d& set        (const UcGeCurve3d& curve1,
                                     const UcGeCurve3d& curve2,
		                             const UcGeVector3d& planeNormal = 
								     UcGeVector3d::kIdentity,
                                     const UcGeTol& tol = UcGeContext::gTol);
    UcGeCurveCurveInt3d& set        (const UcGeCurve3d& curve1,
                                     const UcGeCurve3d& curve2,
                                     const UcGeInterval& range1,
                                     const UcGeInterval& range2,
		                             const UcGeVector3d& planeNormal = 
							         UcGeVector3d::kIdentity,
                                     const UcGeTol& tol = UcGeContext::gTol);

    UcGeCurveCurveInt3d& operator = (const UcGeCurveCurveInt3d& src);
};

#pragma pack (pop)
#endif
